package com.xingjiejian.feature.lambda;

import com.xingjiejian.feature.lambda.pojo.Human;

import java.util.Arrays;
import java.util.List;

/**
 * 在Stream的map()方法和reduce()中使用Lambda表达式
 *
 * @author XingJiejian
 * @date 2019/5/9 0009
 */
public class Demo6 {
    public static void main(String[] args) {
        // 定义集合：记录每个订单的金额
        List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);

        // 不使用lambda表达式为每个订单加上12%的税
//        for (Integer cost : costBeforeTax) {
//            double price = cost + .12*cost;
//            System.out.println(price);
//        }

        // <R> Stream<R> map(Function<? super T, ? extends R> mapper);
        // 传入一个Function的函数式接口，用来归类，结果一般是一组数据，集合元素类型可以改变
        //costBeforeTax.stream().map((cost) -> cost + .12 * cost).forEach(System.out::println);

        //Optional<T> reduce(BinaryOperator<T> accumulator);
        // 对Stream中的数据通过累加器accumulator迭代计算，最终得到一个Optional对象
        /*
         (sum, cost) -> sum + cost 相当于
         for (Integer cost : costBeforeTax) {
            sum += cost;
        }
          */
        double bill = costBeforeTax.stream().map((cost) -> cost + .12 * cost).reduce((sum, cost) -> sum + cost).get();
        System.out.println("Total : " + bill);


        List<Human> humans = Arrays.asList(new Human("Tom", 20), new Human("Jerry", 18));
        humans.stream().map(Human::getName).forEach(System.out::println);
    }
}
